package HelloSeries.strategies.search;

import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.apache.log4j.Logger;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;

import HelloSeries.conf.Configuration;
import HelloSeries.metier.Serie;
import HelloSeries.strategies.TorrentSearch;

public class EztvSearch extends TorrentSearch{

    private final String url_eztv= "http://www.ezrss.it/search/index.php?simple&mode=rss&";
    private final String entete = "[EZTV] ";
    private static Logger logger = Logger.getLogger(EztvSearch.class);

    @SuppressWarnings("unchecked")
    public synchronized ArrayList<Serie> executeSearch (Serie serie){
        try {
            logger.warn(entete+"recherche de "+serie.getNomSerie());
            if (serie.getVersion().isVO()){
                boolean nextsaison = true;
                boolean findInSeason=true;
                Serie current_serie = new Serie();
                current_serie.copy(serie);
                while(nextsaison){
                    findInSeason=true;
                    nextsaison = false;
                    // While : une episode est trouv� dans le saison, sort quand l'�pisode n'est pas trouv�
                    while (findInSeason){
                        // R�cup�ration de l'url de recherche
                        String nom_url = getUrlRecherche( current_serie );
                        logger.warn(entete+"url de recherche : "+nom_url);
                        URL url = new URL (nom_url);
                        // Parsing de l'url
                        Document document = createSAXBuilder().build( url );
                        // R�cup�ration des donn�es
                        List<Element> items = document.getRootElement().getChild("channel").getChildren("item");
                        // Cr�ation s�rie temporaire
                        Serie serie_tmp = new Serie();
                        // Boolean si on a des r�sultats mais que aucun ne correspond
                        boolean nomatch = false;

                        if(!items.isEmpty()){
                            // Recherche dans les r�sultats
                            for (Iterator<Element> iterator2 = items.iterator(); iterator2.hasNext();) {
                                Element e = (Element) iterator2.next();
                                Serie s = new Serie( getTitre( e ) );

                                // Cas particulier EZTV
                                // R�cup�ration du vrai titre
                                s.setNomSerie(e.getChildText("description").split(";")[0].split(":")[1].trim());

                                if ( current_serie.isHD().equals(s.isHD()) && current_serie.getNomSerie().toLowerCase().equals(s.getNomSerie().toLowerCase())){
                                    // R�cup�ration de l'url
                                    s.setUrl( getUrl( e ) );

                                    // R�cup�ration de la taille
                                    double taille = getTaille( e );

                                    if (taille > Configuration.getInstance().getSizemin()  && taille < Configuration.getInstance().getSizemax() ){
                                        serie_tmp.copy( s );
                                        findInSeason = true;
                                        nextsaison = true;
                                        nomatch = true;
                                    }
                                }
                            }
                        }
                        else findInSeason = false;

                        // Si on a trouv� une s�rie on l'ajoute aux nouvelles
                        if ( findInSeason && nomatch )
                        {
                            liste_new_series.add( serie_tmp );
                        }
                        current_serie.incEpisode();
                    }
                    // On v�rifie si il y a une saison suppl�mentaire
                    current_serie.newSaison();
                    String nom_url = url_eztv+"show_name="+current_serie.getNomSerie()+"&episode=1&season="+current_serie.getSaison();
                    URL url = new URL (nom_url);
                    // Parsing de l'url
                    Document document = createSAXBuilder().build( url );
                    // R�cup�ration des donn�es
                    nextsaison = (!document.getRootElement().getChild("channel").getChildren("item").isEmpty());
                }
            }
        } catch (MalformedURLException e) {
            logger.error(e.getMessage());
        } catch (IOException e) {
            logger.error(entete+"Erreur de connexion");
            logger.error(e.getMessage());
        }catch (JDOMException e) {
            logger.error(e.getMessage());
        }
        logger.warn( entete + liste_new_series.size() + " �pisode(s) trouv�(s)" );
        return liste_new_series;
    }

    @Override
    protected int getSeeds( Element e )
    {
        return -1;
    }

    @Override
    protected double getTaille( Element e )
    {
        return Double.parseDouble( e.getChild( "enclosure" ).getAttributeValue( "length" ) ) / 1000000;
    }

    @Override
    protected String getTitre( Element e )
    {
        return e.getChildText( "title" );
    }

    @Override
    protected String getUrl( Element e )
    {
        return e.getChild( "enclosure" ).getAttributeValue( "url" );
    }

    @Override
    protected String getUrlRecherche( Serie serie )
    {
        return url_eztv + "show_name=" + serie.getNomSerie().replaceAll( " ", "+" ) + "&episode="
                + ( serie.getEpisode() + 1 ) + "&season=" + serie.getSaison();
    }

}
